package com.ahaoyou.lock;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * Semaphore是一个计数信号量,Semaphore经常用于限制获取资源的线程数量
 */
public class SemaphoreTest {

    public static void main(String[] args) throws InterruptedException {
//        // 声明3个窗口  state:  资源数
//        Semaphore windows = new Semaphore(3);
//
//        for (int i = 0; i < 5; i++) {
//            new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    try {
//                        // 占用窗口    加锁
//                        windows.acquire();
//                        System.out.println(Thread.currentThread().getName() + ": 开始买票");
//                        //模拟买票流程
//                        Thread.sleep(5000);
//                        System.out.println(Thread.currentThread().getName() + ": 购票成功");
//
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    } finally {
//                        // 释放窗口
//                        windows.release();
//                    }
//                }
//            }).start();
//
//        }
        Semaphore latch = new Semaphore(1);
        new Thread(() -> {
            while (true) {
                try {
//                    latch.tryAcquire(3, TimeUnit.SECONDS);
                    latch.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "++++++++++++++++++++++++++++++++++++");
            }
        }).start();
//        new Thread(() -> {
//            while (true) {
//                try {
//                    latch.tryAcquire(2, TimeUnit.SECONDS);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + "++++++++++++++++++++++++++++++++++++");
//            }
//        }).start();
    }

}
